#include "cabeceras.h"

#define TAMTABLA 1666

int main(void) 
{
	// Arreglo de cadenas de cada archivo
	char **productos = NULL;
	char **ofertas = NULL;
	char **compras = NULL;

	// # de líneas de cada uno de los archivos leídos.
	int lineas_pro = 0, lineas_oft = 0, lineas_comp = 0; 
	// i es multipropósito
	int i = 0, j = 0, k, r, total, descuento;
	int cantidad; // Cantidad de datos leídos
	FILE **b = NULL; // boletas
	char boleta[30]; // Nombre de la boleta, ej: Boleta1.dat
	struct tCliente c[1666], c_tmp;

	// Las estructuras sobre las que opera el hashing
	struct tProducto p[1666], p_tmp;
	struct tOferta o[70], o_tmp;

	// Inicializamos las estructuras, id == -1 significa que está vacia
	for (i = 0; i < 1666; i++) {
		p[i].id = -1;
		c[i].id = -1;
	}

	for (i = 0; i < 70; i++)
		o[i].id = -1;

	lee(&productos, &lineas_pro, "Productos.dat");
	lee(&ofertas, &lineas_oft, "Ofertas.dat");
	lee(&compras, &lineas_comp, "Compras.dat");

	// Insertar Productos
	for (i = 0; i < lineas_pro - 2; i++) {
		p_tmp.id = c[i].id = atoi(productos[i]);
		reemplazar_caracter(productos[i+1], 30, '\n', '\0');
		strncpy(p_tmp.nombre, productos[i+1], 30);
		p_tmp.precio = atoi(productos[i+2]);
		if (hashinsert_P(HT(p_tmp.id, 1666), p, 1666, p_tmp) == 1) {
			printf("Error al insertar id: %d\n", p_tmp.id);
			goto liberar;
		}
	}

	// Insertar Ofertas
	for (i = 0; i < lineas_oft - 2; i++) {
		o_tmp.id = atoi(ofertas[i]);
		o_tmp.num = atoi(ofertas[i+1]);
		o_tmp.descuento = atoi(ofertas[i+2]);
		if (hashinsert_O(HT(o_tmp.id, 70), o, 70, o_tmp) == 1) {
			printf("Error al insertar id: %d\n", o_tmp.id);
			goto liberar;
		}
	}

	memset(&p_tmp, 0, sizeof(p_tmp));
	memset(&o_tmp, 0, sizeof(o_tmp));

//	p_tmp = hashsearch_P(HT(0, 1666), p, 1666, 0);
//	o_tmp = hashsearch_O(HT(2, 70), o, 70, 2);

	//printf("id: %d\nnombre: %s\nprecio: %d\n", p_tmp.id, p_tmp.nombre, p_tmp.precio);
//	printf("id: %d\nnum: %d\ndescuento: %d\n", o_tmp.id, o_tmp.num, o_tmp.descuento);

	i = 0;

	do {
		
		b = realloc(b, sizeof(FILE*)*(i+1));

		memset(boleta, 0, sizeof(boleta));
		snprintf(boleta, 30, "boletas/Boleta%d.dat", i+1);

		b[i] = fopen(boleta, "w");

		// Manejar Compras.dat
		cantidad = atoi(compras[j]);
		for (r = 0; r < 1666; r++)
			c[r].cant = 0;

		total = 0;
		descuento = 0;

		for (j += 1, k = j; j < k + cantidad; j++) {
		//	printf("j =%d, lineas_comp = %d, compras[%d] = %s, cantidad = %d\n", j, lineas_comp, j, compras[j], cantidad);
			memset(&p_tmp, 0, sizeof(p_tmp));
			p_tmp = hashsearch_P(HT((unsigned int) atoi(compras[j]), 1666),\
				p, 1666, atoi(compras[j]));
			total += p_tmp.precio;
			for (r = 0; r < 1666; r++) {
				if (c[r].id == p_tmp.id) {
					c[r].cant++;
					o_tmp = hashsearch_O(HT((unsigned int)\
						atoi(compras[j]), 70),\
						o, 70, atoi(compras[j]));
					if (o_tmp.id == c[r].id) {
						if (c[r].cant >= o_tmp.num) {
							total -= o_tmp.descuento;
							descuento += o_tmp.descuento;
						}
					}
				}
			}
			fprintf(b[i], "%d %s $%d\n", p_tmp.id, p_tmp.nombre, p_tmp.precio);
		}

		fprintf(b[i], "---\n");
		fprintf(b[i], "Descuento -$%d\n", descuento);
		fprintf(b[i], "Total: $%d\n", total);

		i++;

	} while (j < lineas_comp);

liberar:
	for (j = 0; j < i; j++)
		fclose(b[j]);
	liberar_memoria(productos, lineas_pro);
	liberar_memoria(ofertas, lineas_oft);
	liberar_memoria(compras, lineas_comp);
}
